package com.tanhua.admin.service;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tanhua.dubbo.api.MovementApi;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.api.VideoApi;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.mongo.Movement;
import com.tanhua.model.mongo.Video;
import com.tanhua.model.vo.MovementsVo;
import com.tanhua.model.vo.PageResult;
import com.tanhua.model.vo.VideoVo;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class ManageService {

    @DubboReference
    private UserInfoApi userInfoApi;

    @DubboReference
    private VideoApi videoApi;

    @DubboReference
    private MovementApi movementApi;

    /**
     * 查询所有用户信息
     *   userInfo : mysql数据
     */
    public PageResult users(Integer page, Integer pagesize) {
        //1、调用API分页查询用户信息（返回值：IPage）
        IPage pages = userInfoApi.findAll(page,pagesize);
        //2、构造PageResult
        return new PageResult(page,pagesize,pages.getTotal(),pages.getRecords());
    }

    //根据id查询用户信息UserInfo
    public UserInfo findUserById(Long userId) {
        return userInfoApi.findById(userId);
    }

    //根据用户id，分页查询用户发布的视频列表。返回PageResult（List<VideoVo>）
    public PageResult findVideoByUserId(Long userId, Integer page, Integer pagesize) {
        //1、调用API查询视频数据，返回的是一个 PageResult -- List<Video>
        PageResult result = videoApi.findByUserId(userId,page,pagesize); //总条数，视频列表
        //2、提取内部的视频列表
        List<Video> items = (List<Video>) result.getItems();
        //3、判断是否为空
        if(CollUtil.isEmpty(items)) {
            return result;
        }
        //所有视频作者id
        List<Long> ids = CollUtil.getFieldValues(items, "userId", Long.class);
        //一次性查询视频作者
        Map<Long, UserInfo> map = userInfoApi.findByIds(ids);
        //4、循环List<Video>，一个Video构造一个VideoVo
        List<VideoVo> vos = new ArrayList<>();
        for (Video item : items) {
            //查询视频作者的信息
            UserInfo userInfo = map.get(item.getUserId());
            VideoVo vo = VideoVo.init(userInfo, item);
            vos.add(vo);
        }
        //5、返回
        result.setItems(vos);
        return result;
    }

    //查询动态列表
    public PageResult findMovements(Integer page, Integer pagesize, Long userId, Integer status) {
        //1、调用API查询动态数据，PageResult，内部封装的  List<Movement>
        PageResult result = movementApi.findAll(page,pagesize,userId,status);
        //2、获取内部的List<Movement>
        List<Movement> items = (List<Movement>) result.getItems();
        //3、判断是否为空
        if(CollUtil.isEmpty(items)) {
            return result;
        }
        //所有动态发布人id
        List<Long> ids = CollUtil.getFieldValues(items, "userId", Long.class);
        //一次性查询所有动态发布人
        Map<Long, UserInfo> map = userInfoApi.findByIds(ids);
        //4、循环List<Movement>，一个Video构造一个MovementsVo
        List<MovementsVo> vos = new ArrayList<>();
        for (Movement item : items) {
            UserInfo userInfo = map.get(item.getUserId());
            MovementsVo vo = MovementsVo.init(userInfo, item);
            vos.add(vo);
        }
        //5、返回
        result.setItems(vos);
        return result;
    }
}
